home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
xhearts
/
gfx.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-09
|
32KB
|
1,106 lines
/*
* Spider card bitmap drawing routines, modified for external use
* by Mike Yang, Silicon Graphics, mikey@sgi.com.
*
*/
/*
* Copyright 1990 Heather Rose and Sun Microsystems, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the names of Donald Woods and Sun Microsystems not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Heather Rose and Sun Microsystems not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Heather Rose and Sun Microsystems make
* no representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*
* THE ABOVE-NAMED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT
* SHALL HEATHER ROSE OR SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author:
* Heather Rose
* hrose@sun.com
*
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, CA 94043
*/
/*
* Copyright 1990 David Lemke and Network Computing Devices
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Network Computing Devices not be
* used in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission. Network Computing
* Devices makes no representations about the suitability of this software
* for any purpose. It is provided "as is" without express or implied
* warranty.
*
* NETWORK COMPUTING DEVICES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
* IN NO EVENT SHALL NETWORK COMPUTING DEVICES BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
* OR PERFORMANCE OF THIS SOFTWARE.
*
* Author:
* Dave Lemke
* lemke@ncd.com
*
* Network Computing Devices, Inc
* 350 North Bernardo Ave
* Mountain View, CA 94043
*
* @(#)copyright.h 2.2 90/04/27
*
*/
/*
% Copyright (c) 1989, Donald R. Woods and Sun Microsystems, Inc.
%
% Permission to use, copy, modify, distribute, and sell this software and its
% documentation for any purpose is hereby granted without fee, provided that
% the above copyright notice appear in all copies and that both that copyright
% notice and this permission notice appear in supporting documentation, and
% that the names of Donald Woods and Sun Microsystems not be used in
% advertising or publicity pertaining to distribution of the software without
% specific, written prior permission. Donald Woods and Sun Microsystems make
% no representations about the suitability of this software for any purpose.
% It is provided "as is" without express or implied warranty.
%
% THE ABOVE-NAMED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
% INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT
% SHALL DONALD WOODS OR SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
% CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
% DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
% TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
% OF THIS SOFTWARE.
%
% History: Spider is a solitaire card game that can be found in various books
% of same; the rules are presumed to be in the public domain. The author's
% first computer implementation was on the Stanford Artificial Intelligence Lab
% system (SAIL). It was later ported to the Xerox Development Environment.
% The card images are loosely based on scanned-in images but were largely
% redrawn by the author with help from Larry Rosenberg.
%
% This program is written entirely in NeWS and runs on OPEN WINDOWS 1.0.
% It could be made to run much faster if parts of it were written in C, using
% NeWS mainly for its display and input capabilities, but that is left as an
% exercise for the reader. Spider may also run with little or no modification
% on subsequent releases of OPEN WINDOWS, but no guarantee is made on this
% point (nor any other; see above!). To run Spider, feed this file to 'psh'.
%
% Author: Don Woods
% woods@sun.com
%
% Sun Microsystems, Inc.
% 2550 Garcia Avenue
% Mountain View, CA 94043
*/
/*
* Spider card drawing routines
*/
#include "gfx.h"
#include <X11/Xutil.h>
#include <stdio.h>
#include <assert.h>
/*
* spider global variables
*/
Display *dpy;
int screen;
Pixmap greenmap;
Pixmap redmap;
Pixmap logomap;
unsigned long blackpixel;
unsigned long whitepixel;
unsigned long borderpixel;
unsigned long greenpixel;
Bool is_color;
static GC cardgc; /* gc in use when drawing cards */
/* substitue gray1 for Green on mono */
#define gray1_width 16
#define gray1_height 16
static char gray1_bits[] = {
0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa};
/* logo for card backs */
/* any size logo can be handled. */
#define logo_width 64
#define logo_height 64
static char logo_bits[] = {
0x77,0xd5,0xd7,0xdd,0x77,0xd5,0xd7,0xdd,0xbb,0xea,0xae,0xbb,0xbb,0xea,0xae,
0xbb,0x5d,0x75,0x5d,0x77,0x5d,0x75,0x5d,0x77,0xee,0xba,0xba,0xee,0xae,0xba,
0xba,0xee,0x77,0x5d,0x75,0xdd,0x77,0x5d,0x75,0xdd,0xbb,0xae,0xea,0xba,0xbb,
0xae,0xea,0xba,0x5d,0x57,0xd5,0x75,0x5d,0x57,0xd5,0x75,0xae,0xab,0xaa,0xeb,
0xae,0xab,0xaa,0xeb,0xd7,0x55,0x55,0xd7,0xd7,0x51,0x55,0xd7,0xeb,0xae,0xaa,
0xae,0xeb,0xa2,0xaa,0xae,0x75,0x5d,0x55,0x5d,0x75,0x44,0x15,0x5d,0xba,0xbb,
0xea,0xba,0xba,0x88,0x8a,0xba,0x5d,0x77,0x75,0x75,0x1d,0x11,0x45,0x75,0xee,
0xee,0xba,0xea,0x2e,0x22,0xa2,0xea,0xd7,0xdd,0x5d,0xd5,0x57,0x44,0x10,0xd5,
0xab,0xbb,0xef,0xaa,0xab,0x88,0x88,0xaa,0x57,0x77,0x77,0xd5,0x57,0x11,0x45,
0xd5,0xae,0xee,0xba,0xea,0xae,0x22,0xa2,0xea,0x5d,0xdd,0x5d,0x75,0x5d,0x45,
0x10,0x75,0xba,0xba,0xef,0xba,0xba,0x8a,0x88,0xba,0x75,0x75,0x77,0x5d,0x75,
0x15,0x45,0x5d,0xea,0xea,0xba,0xae,0xea,0x2a,0xa2,0xae,0xdd,0xd5,0x5d,0x77,
0xdd,0x55,0x50,0x77,0xae,0xab,0xaf,0xeb,0xae,0xab,0xa8,0xeb,0xd7,0x55,0x57,
0xd7,0xd7,0x55,0x55,0xd7,0xeb,0xaa,0xaa,0xae,0xeb,0xaa,0xaa,0xae,0x75,0x57,
0x55,0x5d,0x75,0x57,0x55,0x5d,0xba,0xae,0xea,0xba,0xba,0xae,0xaa,0xba,0xdd,
0x5d,0x75,0x75,0xdd,0x5d,0x75,0x75,0xae,0xbb,0xba,0xea,0xae,0xbb,0xba,0xea,
0x77,0x77,0x5d,0xd5,0x77,0x77,0x5d,0xd5,0xeb,0xee,0xee,0xaa,0xeb,0xee,0xae,
0xaa,0xd7,0xdd,0x77,0xd5,0xd7,0xdd,0x77,0xd5,0xae,0xbb,0xbb,0xea,0xae,0xbb,
0xbb,0xea,0x5d,0x77,0x5d,0x75,0x5d,0x77,0x5d,0x75,0xba,0xee,0xee,0xba,0xba,
0xee,0xae,0xba,0x75,0xdd,0x77,0x5d,0x75,0xdd,0x77,0x5d,0xea,0xba,0xbb,0xae,
0xea,0xba,0xbb,0xae,0xd5,0x75,0x5d,0x57,0xd5,0x75,0x5d,0x57,0xaa,0xeb,0xae,
0xab,0xaa,0xeb,0xae,0xab,0x55,0xd7,0xd7,0x55,0x55,0xd7,0xd7,0x55,0xaa,0xae,
0xeb,0xae,0xaa,0xae,0xeb,0xae,0x55,0x5d,0x75,0x5d,0x55,0x5d,0x75,0x5d,0xea,
0xba,0xba,0xbb,0xea,0xba,0xba,0xbb,0x75,0x75,0x5d,0x77,0x75,0x75,0x5d,0x77,
0xba,0xea,0xee,0xee,0xba,0xea,0xee,0xee,0x5d,0xd5,0xd7,0xdd,0x5d,0xd5,0xd7,
0xdd,0xef,0xaa,0xab,0xbb,0xef,0xaa,0xab,0xbb,0x77,0xd5,0x57,0x77,0x77,0xd5,
0x57,0x77,0xba,0xea,0xae,0xee,0xba,0xea,0xae,0xee,0x5d,0x75,0x5d,0xdd,0x5d,
0x75,0x5d,0xdd,0xef,0xba,0xba,0xba,0xef,0xba,0xba,0xba,0x77,0x5d,0x75,0x75,
0x77,0x5d,0x75,0x75,0xba,0xae,0xea,0xea,0xba,0xae,0xea,0xea,0x5d,0x77,0xdd,
0xd5,0x5d,0x77,0xdd,0xd5,0xaf,0xeb,0xae,0xab,0xaf,0xeb,0xae,0xab,0x57,0xd7,
0xd7,0x55,0x57,0xd7,0xd7,0x55,0xaa,0xae,0xeb,0xaa,0xaa,0xae,0xeb,0xaa,0x55,
0x5d,0x75,0x57,0x55,0x5d,0x75,0x57,0xaa,0xba,0xba,0xae,0xaa,0xba,0xba,0xae,
0x75,0x75,0xdd,0x5d,0x55,0x75,0xdd,0x5d,0xba,0xea,0xae,0xbb,0xba,0xea,0xae,
0xbb,0x5d,0xd5,0x77,0x77,0x5d,0xd5,0x77,0x77,0xae,0xaa,0xeb,0xee,0xae,0xaa,
0xeb,0xee};
#include "rank.bm"
#include "face.bm"
#include "suit.bm"
static Pixmap rank_map[NUM_RANKS], rank_r_map[NUM_RANKS];
static Pixmap rank_map_red[NUM_RANKS], rank_r_map_red[NUM_RANKS];
static Pixmap suit_map[NUM_SUITS], suit_r_map[NUM_SUITS];
static Pixmap suit_sm_map[NUM_SUITS], suit_sm_r_map[NUM_SUITS];
static Pixmap suit_lg_map[NUM_SUITS];
static Pixmap jack_map[NUM_SUITS], queen_map[NUM_SUITS], king_map[NUM_SUITS];
/* clipping rectangles */
static XRectangle cliprects[1] = { 0, 0, CARD_WIDTH + 1, 0};
static GC redgc;
static GC blackgc;
static GC whitegc;
static GC backgc;
static int back_delta_x, back_delta_y; /* how much to modify the TS origin by */
static Bool card_is_clipped; /* optimizer for card drawing */
gfx_init(d, scr)
Display *d;
int scr;
{
XGCValues gcv;
long gcflags;
XColor color;
Colormap cmap;
Pixmap tmpmap;
GC logogc;
unsigned long redpixel;
/* save these off */
dpy = d;
screen = scr;
if (DisplayCells(dpy, screen) > 2) {
is_color = True;
} else {
is_color = False;
}
blackpixel = BlackPixel(dpy, screen);
whitepixel = WhitePixel(dpy, screen);
/* make gc for white */
gcv.foreground = WhitePixel(dpy, screen);
gcv.background = BlackPixel(dpy, screen);
gcv.graphics_exposures = False;
gcflags = GCForeground | GCBackground | GCGraphicsExposures;
whitegc = XCreateGC(dpy, RootWindow(dpy, screen), gcflags, &gcv);
/* make gc for black */
gcv.foreground = BlackPixel(dpy, screen);
gcv.background = WhitePixel(dpy, screen);
gcflags = GCForeground | GCBackground | GCGraphicsExposures;
blackgc = XCreateGC(dpy, RootWindow(dpy, screen), gcflags, &gcv);
tmpmap = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
logo_bits, logo_width, logo_height);
logomap = XCreatePixmap(dpy, RootWindow(dpy, screen), logo_width,
logo_height, DefaultDepth(dpy, screen));
back_delta_x = (CARD_WIDTH - logo_width)/2;
back_delta_y = (CARD_HEIGHT - logo_height)/2;
if (is_color) {
cmap = DefaultColormap(dpy, screen);
XAllocNamedColor(dpy, cmap, "Sea Green", &color, &color);
gcv.foreground = color.pixel;
gcv.background = WhitePixel(dpy, screen);
gcflags = GCForeground | GCBackground;
logogc = XCreateGC(dpy, RootWindow(dpy, screen), gcflags, &gcv);
XCopyPlane(dpy, tmpmap, logomap, logogc, 0, 0,
logo_width, logo_height, 0, 0, 1);
XFreeGC(dpy, logogc);
} else {
XCopyPlane(dpy, tmpmap, logomap, whitegc, 0, 0,
logo_width, logo_height, 0, 0, 1);
}
XFreePixmap(dpy, tmpmap);
gcv.tile = logomap;
gcv.fill_style = FillTiled;
gcflags |= GCTile | GCFillStyle | GCGraphicsExposures;
backgc = XCreateGC(dpy, RootWindow(dpy, screen), gcflags, &gcv);
borderpixel = blackpixel;
if (is_color) {
cmap = DefaultColormap(dpy, screen);
color.flags = DoRed | DoGreen | DoBlue;
/*
* color levels are the NeWS RGB values
*/
color.red = 13107; /* 0.2 */
color.green = 52428; /* 0.8 */
color.blue = 39321; /* 0.6 */
XAllocColor(dpy, cmap, &color);
greenpixel = color.pixel;
color.red = 52428; /* 0.8 */
color.green = color.blue = 0;
XAllocColor(dpy, cmap, &color);
redpixel = color.pixel;
gcv.foreground = redpixel;
gcv.background = WhitePixel(dpy, screen);
gcflags = GCForeground | GCBackground | GCGraphicsExposures;
redgc = XCreateGC(dpy, RootWindow(dpy, screen), gcflags, &gcv);
} else {
greenmap = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
gray1_bits, gray1_width, gray1_height);
redmap = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
gray1_bits, gray1_width, gray1_height);
gcv.tile = redmap;
gcv.fill_style = FillTiled;
gcv.foreground = BlackPixel(dpy, screen);
gcv.background = WhitePixel(dpy, screen);
gcflags = GCTile | GCForeground | GCBackground |
GCFillStyle | GCGraphicsExposures;
redgc = XCreateGC(dpy, RootWindow(dpy, screen), gcflags, &gcv);
}
make_card_maps();
}
/*
* make a 'red' pixmap by setting the clipmask to the desired shape and
* pushing 'red' through it
*/
static Pixmap
make_red_map(bits, width, height)
char *bits;
int width, height;
{
Pixmap tmpmap, newmap;
static GC cleargc = (GC) 0;
XGCValues xgcv;
if (cleargc == (GC) 0) {
xgcv.function = GXclear;
cleargc = XCreateGC(dpy, RootWindow(dpy, screen), GCFunction,
&xgcv);
}
tmpmap = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
bits, width, height);
newmap = XCreatePixmap(dpy, RootWindow(dpy, screen), width, height, 1);
/* clear pixmap */
XFillRectangle(dpy, newmap, cleargc, 0, 0, width, height);
XSetClipMask(dpy, redgc, tmpmap);
XFillRectangle(dpy, newmap, redgc, 0, 0, width, height);
XSetClipMask(dpy, redgc, None);
XFreePixmap(dpy, tmpmap);
return (newmap);
}
make_card_maps()
{
unsigned char *new_bits;
Rank r;
int i;
for (r = Ace; r <= King; r++) {
rank_map[(int)r] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
rank_bits[(int)r], rank_width, rank_height);
new_bits = (unsigned char *) calloc(sizeof(rank_bits[(int)r]),
1);
rot_180((unsigned char *)rank_bits[(int)r], new_bits,
rank_width, rank_height);
rank_r_map[(int)r] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
new_bits, rank_width, rank_height);
free((char *)new_bits);
}
for (r = Ace; r <= King; r++) {
new_bits = (unsigned char *) calloc(sizeof(rank_bits[(int)r]),
1);
rot_180((unsigned char *)rank_bits[(int)r], new_bits,
rank_width, rank_height);
if (is_color) {
rank_map_red[(int)r] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
rank_bits[(int)r], rank_width, rank_height);
rank_r_map_red[(int)r] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
new_bits, rank_width, rank_height);
} else {
rank_map_red[(int)r] = make_red_map(rank_bits[(int)r],
rank_width, rank_height);
rank_r_map_red[(int)r] = make_red_map((char *)new_bits,
rank_width, rank_height);
}
free((char *)new_bits);
}
i = (int)Spade;
/* make all the card bitmaps */
suit_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
spade_bits, spade_width, spade_height);
new_bits = (unsigned char *) calloc(sizeof(spade_bits), 1);
flip_bits((unsigned char *)spade_bits, new_bits, spade_width,
spade_height);
suit_r_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
new_bits, spade_width, spade_height);
free((char *)new_bits);
suit_sm_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
spade_sm_bits, spade_sm_width, spade_sm_height);
new_bits = (unsigned char *) calloc(sizeof(spade_sm_bits), 1);
flip_bits((unsigned char *)spade_sm_bits, new_bits, spade_sm_width,
spade_sm_height);
suit_sm_r_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
new_bits, spade_sm_width, spade_sm_height);
free((char *)new_bits);
suit_lg_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
spade_lg_bits, spade_lg_width, spade_lg_height);
jack_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
jack_s_bits, jack_s_width, jack_s_height);
queen_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
queen_s_bits, queen_s_width, queen_s_height);
king_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
king_s_bits, king_s_width, king_s_height);
i = (int)Heart;
/* make all the card bitmaps */
new_bits = (unsigned char *) calloc(sizeof(heart_bits), 1);
flip_bits((unsigned char *)heart_bits, new_bits, heart_width,
heart_height);
if (is_color) {
suit_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
heart_bits, heart_width, heart_height);
suit_r_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
new_bits, heart_width, heart_height);
} else {
suit_map[i] = make_red_map(heart_bits, heart_width,
heart_height);
suit_r_map[i] = make_red_map((char *)new_bits, heart_width,
heart_height);
}
free((char *)new_bits);
new_bits = (unsigned char *) calloc(sizeof(heart_sm_bits), 1);
flip_bits((unsigned char *)heart_sm_bits, new_bits, heart_sm_width,
heart_sm_height);
suit_sm_r_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
new_bits, heart_sm_width, heart_sm_height);
if (is_color) {
suit_sm_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
heart_sm_bits, heart_sm_width, heart_sm_height);
suit_sm_r_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
new_bits, heart_sm_width, heart_sm_height);
} else {
suit_sm_map[i] = make_red_map(heart_sm_bits, heart_sm_width,
heart_height);
suit_sm_r_map[i] = make_red_map((char *)new_bits,
heart_sm_width, heart_sm_height);
}
free((char *)new_bits);
suit_lg_map[i] = suit_map[i];
if (is_color) {
jack_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
jack_h_bits, jack_h_width, jack_h_height);
queen_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
queen_h_bits, queen_h_width, queen_h_height);
king_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
king_h_bits, king_h_width, king_h_height);
} else {
jack_map[i] = make_red_map(jack_h_bits, jack_h_width,
jack_h_height);
queen_map[i] = make_red_map(queen_h_bits, queen_h_width,
queen_h_height);
king_map[i] = make_red_map(king_h_bits, king_h_width,
king_h_height);
}
i = (int)Diamond;
/* make all the card bitmaps */
new_bits = (unsigned char *) calloc(sizeof(diamond_bits), 1);
flip_bits((unsigned char *)diamond_bits, new_bits, diamond_width,
diamond_height);
if (is_color) {
suit_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
diamond_bits, diamond_width, diamond_height);
suit_r_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
new_bits, diamond_width, diamond_height);
} else {
suit_map[i] = make_red_map(diamond_bits, diamond_width,
diamond_height);
suit_r_map[i] = make_red_map((char *)new_bits, diamond_width,
diamond_height);
}
free((char *)new_bits);
new_bits = (unsigned char *) calloc(sizeof(diamond_sm_bits), 1);
flip_bits((unsigned char *)diamond_sm_bits, new_bits,
diamond_sm_width, diamond_sm_height);
suit_sm_r_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
new_bits, diamond_sm_width, diamond_sm_height);
if (is_color) {
suit_sm_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
diamond_sm_bits, diamond_sm_width, diamond_sm_height);
suit_sm_r_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
new_bits, diamond_sm_width, diamond_sm_height);
} else {
suit_sm_map[i] = make_red_map(diamond_sm_bits, diamond_sm_width,
diamond_height);
suit_sm_r_map[i] = make_red_map((char *)new_bits,
diamond_sm_width, diamond_sm_height);
}
free((char *)new_bits);
suit_lg_map[i] = suit_map[i];
if (is_color) {
jack_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
jack_d_bits, jack_d_width, jack_d_height);
queen_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
queen_d_bits, queen_d_width, queen_d_height);
king_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
king_d_bits, king_d_width, king_d_height);
} else {
jack_map[i] = make_red_map(jack_d_bits, jack_d_width,
jack_d_height);
queen_map[i] = make_red_map(queen_d_bits, queen_d_width,
queen_d_height);
king_map[i] = make_red_map(king_d_bits, king_d_width,
king_d_height);
}
i = (int)Club;
/* make all the card bitmaps */
suit_map[i] = XCreateBitmapFromData(dpy,
RootWindow(dpy, screen),
club_bits, club_width, club_height);
new_bits = (unsigned char *) calloc(sizeof(club_bits), 1);
flip_bits((unsigned char *)club_bits, new_bits, club_width,
club_height);
suit_r_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
new_bits, club_width, club_height);
free((char *)new_bits);
suit_sm_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
club_sm_bits, club_sm_width, club_sm_height);
new_bits = (unsigned char *) calloc(sizeof(club_sm_bits), 1);
flip_bits((unsigned char *)club_sm_bits, new_bits, club_sm_width,
club_sm_height);
suit_sm_r_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
new_bits, club_sm_width, club_sm_height);
free((char *)new_bits);
suit_lg_map[i] = suit_map[i];
jack_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
jack_c_bits, jack_c_width, jack_c_height);
queen_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
queen_c_bits, queen_c_width, queen_c_height);
king_map[i] = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
king_c_bits, king_c_width, king_c_height);
}
static unsigned char _reverse_byte[0x100] = {
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
};
#define S(x,y) src[(H-1-(y))*W+(x)]
#define D(x,y) dst[(H-1-(y))*W+(x)]
flip_bits(src, dst, W, H)
unsigned char *src, *dst;
int W, H;
{
int x, y;
W = (W + 7)/8;
for (y = 0; y < H; y++) {
for (x = 0; x < W; x++) {
D (x, y) = S (x, H - 1 - y);
}
}
}
rot_180(src, dst, W, H)
unsigned char *src, *dst;
int W, H;
{
int x, y;
int width = W;
unsigned char *new;
int bit;
W = (W + 7)/8;
for (y = 0; y < H; y++) {
for (x = 0; x < W; x++) {
D (x, y) = _reverse_byte[S (W - 1 - x, H - 1 - y)];
}
}
/* shift it over */
new = (unsigned char *)calloc((unsigned)W*H, (unsigned)1);
for (y = 0; y < H; y++) {
for (x = 0; x < W*8; x++) {
bit = (*(dst + (x + (W*8 - width))/8 + y * W)
& (1 << ((x + (W*8 - width)) % 8))) ? 1 : 0;
*(new + x/8 + y*W) = (bit << (x%8)) |
(*(new + x/8 + y*W) & ~(1 << (x%8)));
}
}
bcopy((char *)new, (char *)dst, W*H);
free((char *)new);
}
/*
* delta is 0 if the card is fully showing
*/
paint_card(table, x, y, rank, suit, delta)
Window table;
int x,y;
Rank rank;
Suit suit;
int delta;
{
if (suit == Spade || suit == Club) {
cardgc = blackgc;
} else {
cardgc = redgc;
}
if (delta) {
cliprects[0].height = delta;
XSetClipRectangles(dpy, cardgc, x, y, cliprects, 1, Unsorted);
{
/* fill the background */
XFillRectangle(dpy, table, whitegc, x, y,
CARD_WIDTH, delta);
/* draw border on card */
XDrawRectangle(dpy, table, blackgc, x, y,
CARD_WIDTH, delta);
}
card_is_clipped = True;
} else { /* fill all the card */
{
/* fill the background */
XFillRectangle(dpy, table, whitegc, x, y,
CARD_WIDTH, CARD_HEIGHT);
/* draw border on card */
XDrawRectangle(dpy, table, blackgc, x, y,
CARD_WIDTH, CARD_HEIGHT);
}
card_is_clipped = False;
}
switch (rank) {
case King:
draw_king(table, suit, x, y);
break;
case Queen:
draw_queen(table, suit, x, y);
break;
case Jack:
draw_jack(table, suit, x, y);
break;
case Ten:
draw_pip(table, suit, MID_CARD_X + x, CARD_TEN_Y1 + y);
draw_did(table, suit, MID_CARD_X + x, CARD_TEN_Y2 + y);
draw_eight_pips(table, suit, x, y);
break;
case Nine:
draw_pip(table, suit, x + MID_CARD_X, y + MID_CARD_Y);
draw_eight_pips(table, suit, x, y);
break;
case Eight:
draw_did(table, suit, x + MID_CARD_X, y + CARD_EIGHT_Y);
/* fall thru */
case Seven:
draw_pip(table, suit, MID_CARD_X + x, CARD_SEVEN_Y + y);
/* fall thru */
case Six:
draw_six_pips(table, suit, x, y);
break;
case Five:
draw_pip(table, suit, x + MID_CARD_X, y + MID_CARD_Y);
/* fall thru */
case Four:
draw_four_pips(table, suit, x, y);
break;
case Three:
draw_pip(table, suit, x + MID_CARD_X, y + MID_CARD_Y);
/* fall thru */
case Deuce:
draw_two_pips(table, suit, x, y);
break;
case Ace:
draw_center_pip(table, suit, x + MID_CARD_X, y + MID_CARD_Y);
break;
default:
assert(0);
}
draw_rank(table, x, y, rank, suit);
/* clear the clip mask */
XSetClipMask(dpy, cardgc, None);
}
/*
* NOTE -- for all the pip drawers except the one that actually plots the
* bits, the location is the card's location. the drawer's take the
* pip's center as location.
*/
/*
* draws right-side-up pip
*
* location is for center of pip
*/
draw_pip(table, suit, x, y)
Window table;
Suit suit;
int x, y;
{
int w, h;
switch(suit) {
case Spade:
w = spade_width;
h = spade_height;
break;
case Diamond:
x++;
w = diamond_width;
h = diamond_height;
break;
case Heart:
y++;
w = heart_width;
h = heart_height;
break;
case Club:
y++;
w = club_width;
h = club_height;
break;
default:
assert(0);
}
XCopyPlane(dpy, suit_map[suit], table, cardgc,
0, 0, w, h,
x - w/2, y - h/2, 1);
}
/*
* draws upside-down pip
*
* location is for center of pip
*/
draw_did(table, suit, x, y)
Window table;
Suit suit;
int x,y;
{
int w, h;
if (card_is_clipped) /* a clipped card never shows any did's */
return;
switch(suit) {
case Spade:
w = spade_width;
h = spade_height;
break;
case Diamond:
x++;
w = diamond_width;
h = diamond_height;
break;
case Heart:
y++;
w = heart_width;
h = heart_height;
break;
case Club:
y++;
w = club_width;
h = club_height;
break;
default:
assert(0);
}
XCopyPlane(dpy, suit_r_map[suit], table, cardgc,
0, 0, w, h,
x - w/2, y - h/2, 1);
}
/*
* draws big center pip
*/
draw_center_pip(table, suit, x, y)
Window table;
Suit suit;
int x,y;
{
int w, h;
if (card_is_clipped)
return;
switch(suit) {
case Spade:
w = spade_lg_width;
h = spade_lg_height;
break;
case Diamond:
w = diamond_width;
h = diamond_height;
break;
case Heart:
w = heart_width;
h = heart_height;
break;
case Club:
w = club_width;
h = club_height;
break;
default:
assert(0);
}
XCopyPlane(dpy, suit_lg_map[suit], table, cardgc,
0, 0, w, h,
x - w/2, y - h/2, 1);
}
/*
* draw_two_pips
*/
draw_two_pips(table, suit, x, y)
Window table;
Suit suit;
int x,y;
{
draw_pip(table, suit, x + MID_CARD_X, y + CARD_ROW1_Y);
draw_did(table, suit, x + MID_CARD_X, y + CARD_ROW5_Y);
}
/*
* draw_four_pips
*/
draw_four_pips(table, suit, x, y)
Window table;
Suit suit;
int x,y;
{
draw_pip(table, suit, x + CARD_COL1_X, y + CARD_ROW1_Y);
draw_did(table, suit, x + CARD_COL1_X, y + CARD_ROW5_Y);
draw_pip(table, suit, x + CARD_COL3_X, y + CARD_ROW1_Y);
draw_did(table, suit, x + CARD_COL3_X, y + CARD_ROW5_Y);
}
draw_six_pips(table, suit, x, y)
Window table;
Suit suit;
int x, y;
{
draw_pip(table, suit, x + CARD_COL1_X, y + CARD_ROW1_Y);
draw_pip(table, suit, x + CARD_COL3_X, y + CARD_ROW1_Y);
if (card_is_clipped)
return;
/* these are only visible when its not clipped */
draw_pip(table, suit, x + CARD_COL1_X, y + CARD_ROW3_Y);
draw_did(table, suit, x + CARD_COL1_X, y + CARD_ROW5_Y);
draw_pip(table, suit, x + CARD_COL3_X, y + CARD_ROW3_Y);
draw_did(table, suit, x + CARD_COL3_X, y + CARD_ROW5_Y);
}
draw_eight_pips(table, suit, x, y)
Window table;
Suit suit;
int x,y;
{
draw_pip(table, suit, x + CARD_COL1_X, y + CARD_ROW1_Y);
draw_pip(table, suit, x + CARD_COL3_X, y + CARD_ROW1_Y);
if (card_is_clipped)
return;
/* these are only visible when its not clipped */
draw_pip(table, suit, x + CARD_COL1_X, y + CARD_ROW2_Y);
draw_did(table, suit, x + CARD_COL1_X, y + CARD_ROW4_Y);
draw_did(table, suit, x + CARD_COL1_X, y + CARD_ROW5_Y);
draw_pip(table, suit, x + CARD_COL3_X, y + CARD_ROW2_Y);
draw_did(table, suit, x + CARD_COL3_X, y + CARD_ROW4_Y);
draw_did(table, suit, x + CARD_COL3_X, y + CARD_ROW5_Y);
}
draw_jack(table, suit, x, y)
Window table;
Suit suit;
int x,y;
{
XCopyPlane(dpy, jack_map[suit], table, cardgc,
0, 0, FACECARD_WIDTH, FACECARD_HEIGHT,
x + (CARD_WIDTH - FACECARD_WIDTH)/2,
y + (CARD_HEIGHT - FACECARD_HEIGHT)/2, 1);
XDrawRectangle(dpy, table, cardgc,
x + (CARD_WIDTH - FACECARD_WIDTH)/2,
y + (CARD_HEIGHT - FACECARD_HEIGHT)/2,
FACECARD_WIDTH, FACECARD_HEIGHT);
}
draw_queen(table, suit, x, y)
Window table;
Suit suit;
int x,y;
{
XCopyPlane(dpy, queen_map[suit], table, cardgc,
0, 0, FACECARD_WIDTH, FACECARD_HEIGHT,
x + (CARD_WIDTH - FACECARD_WIDTH)/2,
y + (CARD_HEIGHT - FACECARD_HEIGHT)/2, 1);
XDrawRectangle(dpy, table, cardgc,
x + (CARD_WIDTH - FACECARD_WIDTH)/2,
y + (CARD_HEIGHT - FACECARD_HEIGHT)/2,
FACECARD_WIDTH, FACECARD_HEIGHT);
}
draw_king(table, suit, x, y)
Window table;
Suit suit;
int x,y;
{
XCopyPlane(dpy, king_map[suit], table, cardgc,
0, 0, FACECARD_WIDTH, FACECARD_HEIGHT,
x + (CARD_WIDTH - FACECARD_WIDTH)/2,
y + (CARD_HEIGHT - FACECARD_HEIGHT)/2, 1);
XDrawRectangle(dpy, table, cardgc,
x + (CARD_WIDTH - FACECARD_WIDTH)/2,
y + (CARD_HEIGHT - FACECARD_HEIGHT)/2,
FACECARD_WIDTH, FACECARD_HEIGHT);
}
draw_rank(table, x, y, rank, suit)
Window table;
int x, y;
Rank rank;
Suit suit;
{
int w, h;
if (suit == Heart || suit == Diamond) {
XCopyPlane(dpy, rank_map_red[rank], table, cardgc,
0, 0, RANK_WIDTH, RANK_HEIGHT,
x + RANK_LOC_X, y + RANK_LOC_Y, 1);
if (!card_is_clipped)
XCopyPlane(dpy, rank_r_map_red[rank], table, cardgc,
0, 0, RANK_WIDTH, RANK_HEIGHT,
x + (CARD_WIDTH - RANK_WIDTH - RANK_LOC_X),
y + (CARD_HEIGHT - RANK_HEIGHT - RANK_LOC_Y), 1);
} else {
XCopyPlane(dpy, rank_map[rank], table, cardgc,
0, 0, RANK_WIDTH, RANK_HEIGHT,
x + RANK_LOC_X, y + RANK_LOC_Y, 1);
if (!card_is_clipped)
XCopyPlane(dpy, rank_r_map[rank], table, cardgc,
0, 0, RANK_WIDTH, RANK_HEIGHT,
x + (CARD_WIDTH - RANK_WIDTH - RANK_LOC_X),
y + (CARD_HEIGHT - RANK_HEIGHT - RANK_LOC_Y), 1);
}
switch (suit) {
case Spade:
w = spade_sm_width;
h = spade_sm_height;
break;
case Heart:
w = heart_sm_width;
h = heart_sm_height;
break;
case Diamond:
x++; /* offset the smaller width */
w = diamond_sm_width;
h = diamond_sm_height;
break;
case Club:
w = club_sm_width;
h = club_sm_height;
break;
default:
assert(0);
}
XCopyPlane(dpy, suit_sm_map[suit], table, cardgc,
0, 0, w, h,
x + SMALL_LOC_X, y + SMALL_LOC_Y, 1);
if (!card_is_clipped)
XCopyPlane(dpy, suit_sm_r_map[suit], table, cardgc,
0, 0, w, h,
x + (CARD_WIDTH - w - SMALL_LOC_X),
y + (CARD_HEIGHT - h - SMALL_LOC_Y), 1);
}